package com.design.working.dao;

import com.design.working.bo.HandleDeptJobApplicationBO;
import com.design.working.dto.*;
import com.design.working.po.admin.*;
import com.design.working.vo.admin.*;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

/**
 * 管理员端数据层
 *
 * @author gavin
 * @date 2022/5/18 10:08
 */
public interface AdminDAO {

    /**
     * 查找未处理的学生工作申请记录
     *
     * @param page  分页参数
     * @param limit 每页条数
     * @return 未处理学生的工作申请记录
     */
    List<AdminHandleStudentWorkApplicationVO> selectStudentWorkApplication(Integer page, Integer limit);

    /**
     * 插入管理员对学生申请记录的审批内容
     *
     * @param adminId                          管理员id
     * @param adminHandleStudentApplicationDTO 管理员对学生申请记录的审批内容
     */
    void insertStudentApplicationHanding(Integer adminId, AdminHandleStudentApplicationDTO adminHandleStudentApplicationDTO);

    /**
     * 通过工号查找管理员在数据库中id
     *
     * @param uid 管理员工号
     * @return 管理员在数据库中id
     */
    int selectAdminId(Integer uid);

    /**
     * 查找申请表中学生申请工作填写的个人信息
     *
     * @param smtId 学生申请工作表中对应的个人信息记录id
     * @return 学生申请工作填写的个人信息
     */
    StudentApplicationDetailPO selectStudentApplicationDetail(Integer smtId);

    /**
     * 查找辅导员和用工部门对学生申请表的意见
     *
     * @param swaId 学生申请工作表id
     * @return 辅导员和用工部门对学生申请表的意见
     */
    AdminPreAdvicePO selectStudentPreAdvice(Integer swaId);

    /**
     * 查询学生岗位变动申请
     *
     * @param page  分页参数
     * @param limit 每页条数
     * @return 学生岗位变动申请的条数
     */
    List<AdminHandleStudentWorkMotionPO> selectStudentWorkMotion(Integer page, Integer limit);

    /**
     * 查找用工部门对学生岗位变更表的意见
     *
     * @param id 学生岗位变更表id
     * @return 用工部门对学生岗位变更表的意见
     */
    AdminPreAdvicePO selectDeptPreAdvice(Integer id);

    /**
     * 查找正在工作的学生和岗位信息
     *
     * @param page  分页页数
     * @param limit 每页数据条数
     * @return 查询到的在岗学生和岗位信息
     */
    List<AdminStudentInWorkingPO> selectAllWorking(Integer page, Integer limit);

    /**
     * 查找正在工作的学生和岗位信息（通过搜索信息）
     *
     * @param page        分页页数
     * @param limit       每页数据条数
     * @param uid         学生学号
     * @param studentName 学生姓名
     * @return 查询到的在岗学生和岗位信息
     */
    List<AdminStudentInWorkingPO> selectAllWorkingByName(Integer page, Integer limit, String uid, String studentName);

    /**
     * 插入管理员处理的学生岗位变更表意见
     *
     * @param adminId                     管理员id
     * @param adminHandleStudentMotionDTO 前端传来的表单数据
     */
    void insertStudentMotionHanding(Integer adminId, AdminHandleStudentMotionDTO adminHandleStudentMotionDTO);

    /**
     * （在岗学生管理）变更岗位 - 强制将在岗学生下岗
     *
     * @param id      student_to_work的id
     * @param adminId 管理员id
     */
    void forceResignStudent(Integer id, Integer adminId);

    /**
     * 查询学生岗位分配记录
     *
     * @param page        分页页数
     * @param limit       每页数据条数
     * @param uid         学生学号
     * @param studentName 学生姓名
     * @return 岗位分配记录
     */
    List<StudentWorkDistributionRecordPO> selectWorkDistributionRecord(Integer page, Integer limit, String uid, String studentName);

    /**
     * 查询学生考勤记录（带时间）
     *
     * @param page        分页页数
     * @param limit       每页数据条数
     * @param uid         学生学号
     * @param studentName 学生姓名
     * @param beginDate   开始日期
     * @param endDate     结束日期
     * @param type        状态（1：查询在岗学生；其他：查询全部学生）
     * @return 学生考勤记录
     */
    List<AdminStudentAttendanceRecordPO> selectStudentAttendanceByTime(Integer page, Integer limit, String uid, String studentName, String beginDate, String endDate, Integer type);

    /**
     * 查询学生考勤记录（不带时间）
     *
     * @param page        分页页数
     * @param limit       每页数据条数
     * @param uid         学生学号
     * @param studentName 学生姓名
     * @param type        状态（1：查询在岗学生；其他：查询全部学生）
     * @return 学生考勤记录
     */
    List<AdminStudentAttendanceRecordPO> selectStudentAttendance(Integer page, Integer limit, String uid, String studentName, Integer type);

    /**
     * 查询学生相关信息
     *
     * @param page        分页页数
     * @param limit       每页数据条数
     * @param uid         学生学号
     * @param studentName 学生姓名
     * @return 学生相关信息
     */
    List<StudentCommonVO> selectStudent(Integer page, Integer limit, String uid, String studentName);

    /**
     * 查询学生详细信息
     *
     * @param uid 学生学号
     * @return 学生个人详细信息
     */
    StudentMsgPO selectStudentMsg(Integer uid);

    /**
     * 查询学生申请岗位的信息
     *
     * @param page        分页页数
     * @param limit       每页数据条数
     * @param uid         学生学号
     * @param studentName 学生姓名
     * @return 学生申请岗位的信息
     */
    List<StudentWorkApplicationAllPO> selectStudentApplicationRecord(Integer page, Integer limit, String uid, String studentName);

    /**
     * 查询学生岗位申请的记录
     *
     * @param swaId 学生岗位申请表id
     * @return 学生岗位申请审批记录
     */
    StudentApplicationExaminationPO selectStudentApplicationExamination(Integer swaId);

    /**
     * 查询岗位工资
     *
     * @param page  分页页数
     * @param limit 每页数据条数
     * @return 岗位工资信息
     */
    List<SelectJobSalaryPO> selectJobSalary(Integer page, Integer limit);

    /**
     * 修改岗位工资
     *
     * @param id        岗位id
     * @param newSalary 新的工资
     */
    void updateJobSalaryById(Integer id, BigDecimal newSalary);

    /**
     * 查询学生工资
     *
     * @param page  分页页数
     * @param limit 每页数据条数
     * @return 学生工资信息
     */
    List<SelectStudentSalaryPO> selectStudentSalary(Integer page, Integer limit);

    /**
     * 通过学号姓名查询学生工资
     *
     * @param page      分页页数
     * @param limit     每页数据条数
     * @param searchDTO 搜索的信息
     * @return 对应的学生工资信息
     */
    List<SelectStudentSalaryPO> selectStudentSalaryByName(Integer page, Integer limit, SearchDTO searchDTO);

    /**
     * 查询所有待审批的部门申请岗位
     *
     * @param page  分页页数
     * @param limit 每页数据条数
     * @return 所有待审批的部门申请岗位
     */
    List<SelectDeptJobApplicationPO> selectDeptJobApplication(Integer page, Integer limit);

    /**
     * 查询部门申请岗位的详细信息
     *
     * @param id dept_job_application表的id
     * @return 相关的详细信息
     */
    DeptJobApplicationDetailVO selectDeptJobApplicationDetail(Integer id);

    /**
     * 批准部门申请岗位（事务控制）
     *
     * @param handleDeptJobApplicationBO  dept_job_application相关数据
     * @param handleDeptJobApplicationDTO 表单数据
     */
    void approveDeptJobApplication(HandleDeptJobApplicationBO handleDeptJobApplicationBO, HandleDeptJobApplicationDTO handleDeptJobApplicationDTO);

    /**
     * 拒绝部门申请岗位
     *
     * @param handleDeptJobApplicationDTO 表单数据
     */
    void rejectDeptJobApplication(HandleDeptJobApplicationDTO handleDeptJobApplicationDTO);

    /**
     * 通过部门员工id查询其所在部门的id
     *
     * @param id dept_employee的id
     * @return dept的id
     */
    int selectDeptIdFromDeptEmployeeId(Integer id);

    /**
     * 查询大部分dept_job_application的信息
     *
     * @param id dept_job_application的id
     * @return 相关信息
     */
    SelectTotalDeptJobApplicationPO selectTotalDeptJobApplication(Integer id);

    /**
     * 查找所有待审核的部门岗位变动记录
     *
     * @param page  分页页数
     * @param limit 每页数据条数
     * @return 所有待审核的岗位变动记录
     */
    List<SelectDeptJobMotionPO> selectDeptJobMotion(Integer page, Integer limit);

    /**
     * 处理部门岗位变动申请--删除岗位
     *
     * @param adminHandleDeptJobWorkMotionDTO 需要处理的数据
     * @param jobId                           岗位id
     */
    void insertDeptJobWorkMotionHandlingIfDeleteJob(AdminHandleDeptJobWorkMotionDTO adminHandleDeptJobWorkMotionDTO, Integer jobId);

    /**
     * 处理部门岗位变动申请--拒绝申请
     *
     * @param adminHandleDeptJobWorkMotionDTO 需要处理的数据
     */
    void insertDeptJobWorkMotionHandlingIfReject(AdminHandleDeptJobWorkMotionDTO adminHandleDeptJobWorkMotionDTO);

    /**
     * 通过dept_job_motion查找对应job_id
     *
     * @param deptJobMotionId dept_job_motion的id
     * @return 对应的job_id
     */
    int selectJobIdFromDeptJobMotion(Integer deptJobMotionId);

    /**
     * 查询全部岗位申请记录
     *
     * @param page  分页页数
     * @param limit 每页数据条数
     * @return 全部岗位申请记录
     */
    List<DeptJobApplicationRecordPO> selectDeptJobApplicationRecord(Integer page, Integer limit);

    /**
     * 关键字查询岗位申请记录
     *
     * @param page                        分页页数
     * @param limit                       每页数据条数
     * @param searchDeptJobApplicationDTO 搜索的数据
     * @return 相关的岗位申请记录
     */
    List<DeptJobApplicationRecordPO> selectDirectDeptJobApplicationRecord(Integer page, Integer limit, SearchDeptJobApplicationDTO searchDeptJobApplicationDTO);

    /**
     * 查询岗位申请记录的审批详情
     *
     * @param id dept_job_application的id
     * @return 相关审批详情
     */
    DeptJobApplicationExaminationVO selectDeptJobApplicationExamination(Integer id);

    /**
     * 查询全部用工评价记录
     *
     * @param page  分页页数
     * @param limit 每页数据条数
     * @return 全部用工评价记录
     */
    List<WorkEvaluationPO> selectWorkEvaluation(Integer page, Integer limit);

    /**
     * 通过关键词查询部分用工评价记录
     *
     * @param page                    分页页数
     * @param limit                   每页数据条数
     * @param searchWorkEvaluationDTO 搜索框传入的相关参数
     * @return 部分用工评价记录
     */
    List<WorkEvaluationPO> selectWorkEvaluationByName(Integer page, Integer limit, SearchWorkEvaluationDTO searchWorkEvaluationDTO);

    /**
     * 通过id查询其对应的用工评价详细信息
     *
     * @param id dept_evaluate_student的id
     * @return 相应的用工评价详细信息
     */
    WorkEvaluationDetailVO selectWorkEvaluationDetailById(Integer id);

    /**
     * 查看管理员是否审批学生岗位申请记录
     *
     * @param swaId student_work_application的id
     * @return 审批结果：0 - 未审批; (-1) - 拒绝; 1 - 通过
     */
    int isStudentApplicationExaminedByAdmin(Integer swaId);

    /**
     * 查看用工部门是否审批学生岗位申请记录
     *
     * @param swaId student_work_application的id
     * @return 审批结果：0 - 未审批; (-1) - 拒绝; 1 - 通过
     */
    int isStudentApplicationExaminedByDeptEmployee(Integer swaId);

    /**
     * 查看辅导员是否审批学生岗位申请记录
     *
     * @param swaId student_work_application的id
     * @return 审批结果：0 - 未审批; (-1) - 拒绝; 1 - 通过
     */
    int isStudentApplicationExaminedByCounselor(Integer swaId);

    /**
     * 查询学生岗位申请的记录(辅导员处理的)
     *
     * @param swaId 学生岗位申请表id
     * @return 学生岗位申请审批记录
     */
    StudentApplicationExaminationPO selectStudentApplicationExaminationByCounselor(Integer swaId);

    /**
     * 查询学生岗位申请的记录(用工部门处理的)
     *
     * @param swaId 学生岗位申请表id
     * @return 学生岗位申请审批记录
     */
    StudentApplicationExaminationPO selectStudentApplicationExaminationByDeptEmployee(Integer swaId);

    /**
     * 手动对单个学生结岗
     *
     * @param id student_to_work的id
     */
    void finishStudentWorkById(Integer id);

    /**
     * 通过年月查询当月工资记录是否生成
     *
     * @param date 查询的年月
     * @return YES - 已生成；NO - 未生成
     */
    int selectSalaryStatusByDate(String date);

    /**
     * 将某月工资设置为已发放
     *
     * @param date 年月
     */
    void updateSalaryByDate(String date);

    /**
     * 查询该年月有考勤的学生swaId和其岗位对应的工资
     *
     * @param date 年月
     * @return 该年月有考勤的学生swaId和其岗位对应的工资
     */
    Map<Integer, BigDecimal> selectStudentWorkByDate(String date);

    /**
     * 查询学生在某年月对应工作的出勤记录
     *
     * @param id   swaId
     * @param date 年月
     * @return swaId在对应年月的出勤记录
     */
    List<Integer> selectWorkAttendanceById(Integer id, String date);

    /**
     * 增加学生在某年月的工作记录（对应插入的salary_date应是工作的下一月）
     *
     * @param id     stwId
     * @param date   发工资的月份
     * @param salary 工作月的工资
     */
    void insertSalaryToStudentByDate(Integer id, String date, BigDecimal salary);

    /**
     * 判断某月是否已经统计并发放过工资
     *
     * @param date 年月
     * @return NO - 未统计并发放；YES - 已统计并发放
     */
    int isSendAndStatisticSalary(String date);
}